home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / pc / 3DTOSHI2.ZIP / mpgfx / source / lgfxdibw.asm < prev    next >
Encoding:
Assembly Source File  |  1996-02-25  |  3.3 KB  |  217 lines

  1.  
  2. ; wdib256.asm
  3. ;
  4. ; Copyright (c) 1995 by Toshiaki Tsuji, all rights reserved.
  5.  
  6. PUBLIC TransBlt256To256_, WaitForRetraceMany_, WaitForRetraceOnce_
  7. PUBLIC WaitForRetraceTerminate_
  8. PUBLIC ScaleBlt256To256_, Affine256To256_
  9.  
  10. .DATA
  11.   U  DD 0
  12.   V  DD 0
  13.   Du DD 0
  14.   Dv DD 0
  15.   SrcAdd DD 4 dup (0)
  16.  
  17.  
  18. InitClockCycle MACRO
  19.   push EAX
  20.   push ECX
  21.   push EDX
  22.   xor  EAX, EAX
  23.   xor  EDX, EDX
  24.   mov  ECX, 010h
  25.   wrmsr
  26.   pop  EDX
  27.   pop  ECX
  28.   pop  EAX
  29. ENDM
  30.  
  31. GetElapsedClock MACRO
  32.   push ECX
  33.   xor  EAX, EAX
  34.   xor  EDX, EDX
  35.   mov  ECX, 010h
  36.   rdmsr
  37.   pop  ECX
  38. ENDM
  39.  
  40. .CODE
  41. .386
  42.  
  43. ; VOID WaitForRetraceMany ( LONG Count )
  44. ;
  45. ; EAX = Count
  46.  
  47. WaitForRetraceMany_ PROC C
  48.   push ECX
  49.   push EDX
  50.   mov  ECX, EAX
  51.   mov  EDX, 03DAh
  52.   
  53.   WFRLoop :
  54.     WaitManyEnd :
  55.       in   al, dx
  56.       test al, 08h
  57.       jnz   WaitManyEnd 
  58.       
  59.     WaitManyStart :
  60.       in   al, dx
  61.       test al, 08h
  62.       jz   WaitManyStart
  63.         
  64.     cmp ECX, 0
  65.     jle EndWaitMany
  66.     dec ECX
  67.     jmp WFRLoop  
  68.     
  69.   EndWaitMany :
  70.         
  71.   pop  EDX
  72.   pop  ECX
  73.   ret
  74. WaitForRetraceMany_ ENDP
  75.  
  76.  
  77. ; VOID WaitForRetraceOnce ()
  78. WaitForRetraceOnce_ PROC C
  79.   push EDX
  80.   mov  EDX, 03DAh
  81.   
  82.   WaitOnceEnd :
  83.     in   al, dx
  84.     test al, 08h
  85.     jnz   WaitOnceEnd 
  86.       
  87.   WaitOnceStart :
  88.     in   al, dx
  89.     test al, 08h
  90.     jz   WaitOnceStart
  91.         
  92.   pop  EDX
  93.   ret
  94. WaitForRetraceOnce_ ENDP
  95.  
  96. ; VOID WaitForRetraceTermin ()
  97. WaitForRetraceTerminate_ PROC C
  98.   push EDX
  99.   mov  EDX, 03DAh
  100.   
  101.   WaitTerminate :
  102.     in   al, dx
  103.     test al, 08h
  104.     jnz   WaitTerminate
  105.       
  106.   pop  EDX
  107.   ret
  108. WaitForRetraceTerminate_ ENDP
  109.  
  110. ; VOID TransBlt256To256 ( BYTE *Dest, BYTE *Src, LONG Wd, BYTE TransColor )
  111. ;
  112. ; EAX = Dest, EDX = Src, EBX = Wd, ECX = TransColor
  113.  
  114. TransBlt256To256_ PROC C
  115.   push EDI
  116.   push ESI
  117.  
  118.   mov  EDI, EAX
  119.   mov  ESI, EDX
  120.   mov  AH, CL
  121.   mov  ECX, EBX
  122.   cld
  123.  
  124.   TransLoop :
  125.     mov AL, [ESI]
  126.     inc ESI
  127.     cmp AH, AL
  128.     je  Skip
  129.       mov [EDI], AL
  130.  
  131.     Skip :
  132.       inc EDI
  133.       dec ECX
  134.     jnz TransLoop
  135.  
  136.   pop  ESI
  137.   pop  EDI
  138.   ret
  139. TransBlt256To256_ ENDP
  140.  
  141.  
  142. ; VOID ScaleBlt ( BYTE *Dest, BYTE *Src, LONG Wd, DWORD Error, DWORD AddError )
  143. ;
  144. ; EAX = Dest, EDX = Src, EBX = Wd, ECX = Error
  145.  
  146. ScaleBlt256To256_ PROC C AddError:DWORD
  147.   push EBP
  148.   push ESI
  149.   push EDI
  150.   
  151.   mov  EDI, EAX
  152.   mov  ESI, EDX
  153.   
  154.   xchg EBX, ECX  ; ECX is the loop count, EBX is the Error  
  155.   mov  EDX, AddError
  156.   mov  EBP, 0
  157.   cld 
  158.   ;InitClockCycle
  159.  
  160.   ScaleLoop :
  161.     mov AL, [ESI+EBP] 
  162.     add EBX, EDX
  163.     mov EBP, EBX
  164.     mov [EDI], AL
  165.     shr EBP, 16
  166.     inc EDI
  167.     dec ECX
  168.     jnz ScaleLoop
  169.     
  170.   ;GetElapsedClock
  171.  
  172.   pop  EDI
  173.   pop  ESI
  174.   pop  EBP
  175.   ret
  176. ScaleBlt256To256_ ENDP
  177.  
  178.  
  179. ; VOID SetSrcAdd ( LONG Add1, LONG Add2 )
  180. ;
  181. ; EAX = U, EDX = V, EBX = Du, ECX = Dv
  182.  
  183. ; VOID SetAffineUV ( LONG U, LONG V, LONG Du, LONG Dv )
  184. ;
  185. ; EAX = U, EDX = V, EBX = Du, ECX = Dv
  186.  
  187. SetAffineUV_ PROC C 
  188.  
  189. SetAffineUV_ ENDP
  190.  
  191.  
  192. ; VOID Affine256To256 ( BYTE *Dest, BYTE *Src, LONG Wd )
  193. ;  
  194. ; EAX = Dest, EDX = Src, EBX = Wd
  195.  
  196. Affine256To256_ PROC C 
  197.   push EBP
  198.   push ESI
  199.   push EDI
  200.   
  201.   mov  EDI, EAX
  202.   mov  ESI, EDX
  203.   
  204.   LoopAffine256 :
  205.   
  206.     loop LoopAffine256
  207.   
  208.   pop  EDI
  209.   pop  ESI
  210.   pop  EBP
  211.   ret
  212. Affine256To256_ ENDP
  213.  
  214. END
  215.  
  216.  
  217.